
// 此处用js模仿V8对于数组push方法的处理


/**
 * V8 源码对于Array.prototype.push 的处理
 * @returns 
 */
function ArrayPush() {
    var n = TO_UINT32(this.length)  // 被push对象的length
    var m = %_ArgumentsLength(); // push的参数个数

    for (let i = 0; i < m; i++) {
        this[ i + n ] = %_Argument( i ); //复制元素
    }

    this.length = n + m //修正length属性的值

    return this.length
}

// 通过这段代码可以看到，Array.prototype.push实际上是一个属性复制的过程，
// 把参数按照下标依次添加到被push的对象上面，顺便修改了这个对象的length属性。
// 至于被修改的对象是谁，到底是数组还是类数组对象，这一点并不重要